/*
 有一颗二叉树，最大深度为D，且所有叶子的深度都相同。所有的结点从上到下从左到右编号为1,2,3,…，2^n-1。
 在结点1处放一个小球，它会往下落。每个内结点上都有一个开关，初始全部关闭，当每次有小球落到一个开关上时，它的状态都会改变。
 当小球到达一个内结点时，如果该结点上的开关关闭，则往左走，否则往右走，直到走到叶子结点。
 一些小球从结点1处依次开始下落，最后一个小球将会落到哪里呢？输入叶子深度D和小球个数I，输出第I个小球最后所在的叶子编号。
 假设I不超过这整棵树的叶子个数。D<=20。输入最多包含1000组数据。
 样例输入：
 4 2
 3 4
 10 1
 2 2
 8 128
 16 12345
 样例输出：
 12
 7
 512
 3
 255
 36358
 -------------------------------------------------------------------------
 分析：对于一个结点k，它的左儿子、右儿子的编号分别是2k和2k+1。
 */
package com.yuan.algorithms.Algorithm_1;

import java.util.Scanner;

public class 二叉树_小球下落 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int D, I;
            D = sc.nextInt();//叶子深度D
            I = sc.nextInt();//小球个数I
            int MAXD = (1 << D) - 1;//最大结点数
            //System.out.println(MAXD);
            boolean[] arr = new boolean[MAXD+1];
            int k = 0;//记录小球落到哪个结点
            for (int i = 0; i < I; i++) {
                k = 1;
                for (int j = 1; j < D; j++) {
                    arr[k] = !arr[k];
                    k = arr[k] ? k * 2 : k * 2 + 1;
                }
            }
            System.out.println(k);
        }
    }

}
